﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Logica.Fabricas;
using Sistema_Totem.Logica.Comandos;
using Sistema_Totem.Presentacion.Contrato.Requerimientos;
using System.Data;
using System.Web.UI.WebControls;

namespace Sistema_Totem.Presentacion.Presentador.Requerimientos
{
    public class PresentadorAgregarRequerimiento2
    {
        #region Atributos

        private IContratoAgregarRequerimientoDetalle _vista;
        private Entidad _requerimiento;
        private Comando <bool> _comandoRequerimiento;

        #endregion Atributos

        #region Constructor

        public PresentadorAgregarRequerimiento2(IContratoAgregarRequerimientoDetalle
            iContratoAgregarRequerimiento)
        {
            _vista = iContratoAgregarRequerimiento;
        }

        #endregion Constructor

        #region Metodos

        #region Mostrar Datos Acordeon
        /// <summary>
        /// Metodo para mostrar los Elementos en el Acordion
        /// </summary>
        /// <param name="requerimiento"></param>
        public void MostrarDatosAcordion(Object requerimiento)
        {
            // contador de la cantidad de filas
                int contador = 0;
            //creacions de los paneles del acordeon
                Label lbTitle;
                Label lbContent;
            // Atributos del tipo TABLE
                Table TablaAcordion = new Table();
                TablaAcordion.ID = "tablaElemento";
                TableRow Filas = new TableRow();
                TablaAcordion.Rows.Add(Filas);
            // creamos una variable del tipo AccordionPane
                AjaxControlToolkit.AccordionPane panel;
                Requerimiento _requerimiento = (Requerimiento)requerimiento;
            // Recorremos la lista de secciones
            foreach (Seccion miSeccion in _requerimiento.ListaSeccion)
            {
                // Deficion de los label del tipo de la seccion
                    lbTitle = new Label();
                    lbTitle.Text = miSeccion.Nombre;
                // Definicion del AcordionPane
                    panel = new AjaxControlToolkit.AccordionPane();
                    panel.ID = miSeccion.Nombre;
                    panel.HeaderContainer.Controls.Add(lbTitle);
                // recorremos la lista de elementos de controles
                foreach (ElementoControl miElementoGrafico in miSeccion.ListaControl)
                {
                    if (contador == 1)
                    {
                        Filas = new TableRow();
                        TablaAcordion.Rows.Add(Filas);
                        contador = 0;
                    }
                    // Creamos el primer TableCell
                        TableCell celda = new TableCell();
                        
                        lbContent = new Label();
                        lbContent.CssClass = "labelRequerimiento";
                        lbContent.Text = miElementoGrafico.Nombre;
                        celda.Controls.Add(lbContent);
                        Filas.Cells.Add(celda);
                    // Creamos el segundo TableCell
                        celda = new TableCell();
                        celda.CssClass = "labelRequerimiento";
                    // llamamos al metodo CreaControl para crear los controles dinamicos
                        CreaControl(miElementoGrafico.Tipo, miElementoGrafico.Nombre, miElementoGrafico.Contenido, panel, celda);
                    // Seteamos la fila con la celda llena del WebControll
                        Filas.Cells.Add(celda);
                        contador++;
                }
                TablaAcordion.ForeColor = System.Drawing.Color.Black;
                // Seteamos el Acordeon con el Table
                    panel.ContentContainer.Controls.Add(TablaAcordion);
                // Seteamos el Acordeon con el AcordeonPanel
                    _vista.ACcordionCtrl.Panes.Add(panel);
                    _vista.ACcordionCtrl.DataBind();               
            }
        }

        #endregion Mostrar Datos Acordeon

        #region Crear Controles
        /// <summary>
        /// Metodo para crear los controles.
        /// </summary>
        /// <param name="tipo"></param>
        /// <param name="nombreElemento"></param>
        /// <param name="ap1"></param>
        /// <param name="celda"></param>
        public void CreaControl(String tipo, String nombreElemento, String ContenidoElemento, AjaxControlToolkit.AccordionPane ap1, TableCell celda)
        {
            String contenido = "";
            
            switch (tipo)
            {
                case "TextBox":
                    TextBox textBoxTotem = new TextBox();
                    textBoxTotem.ID = nombreElemento;
                    textBoxTotem.CssClass = "TextboxRequerimiento";
                    textBoxTotem.ForeColor = System.Drawing.Color.Black;
                    textBoxTotem.Width = 500;

                    //ap1.ContentContainer.Controls.Add(textBoxTotem);
                    celda.Controls.Add(textBoxTotem);
                    break;

                case "Label":
                    Label LabelTotem = new Label();
                    LabelTotem.ID = nombreElemento;
                    LabelTotem.ForeColor = System.Drawing.Color.Black;
                    LabelTotem.CssClass = "labelRequerimiento";
                    LabelTotem.Width = 500;

                    //ap1.ContentContainer.Controls.Add(LabelTotem);
                    celda.Controls.Add(LabelTotem);
                    break;

                case "DropDownList":
                    
                    DropDownList comboBox = new DropDownList();
                    comboBox.ForeColor = System.Drawing.Color.Black;
                    comboBox.ID = nombreElemento;
                    for (int i = 0; i <= ContenidoElemento.Count()-1; i++)
                    {
                        //contenido = contenido + ContenidoElemento[i].ToString();
                        if (ContenidoElemento[i].ToString() == "/" || ContenidoElemento[i] == ContenidoElemento.Count()-1)
                        {
                            comboBox.Items.Add(contenido);
                            contenido = "";
                           
                        }
                        else
                        {
                            contenido = contenido + ContenidoElemento[i].ToString();
                        
                        }
                        
                    }
                    comboBox.Items.Add(contenido);
                    comboBox.Width = 505;

                    celda.Controls.Add(comboBox);
                    
                    break;
            }
        }

        #endregion Crear Controles

        #region Extraer Valores del Acordeon
        
        /// <summary>
        /// Metodo para extraer cada uno de los valores de los controles
        /// </summary>
        public void ExtraerValoresAcordion()
        {
            
            _requerimiento = FabricaEntidad.NuevoRequerimiento();
            Seccion seccion = new Seccion();
            ElementoControl elemento;

            foreach (AjaxControlToolkit.AccordionPane item in _vista.ACcordionCtrl.Panes)
            {
                Object ObjetoGenerico = new Object();
                ObjetoGenerico = item.ContentContainer.FindControl("tablaElemento");
                seccion.Nombre = item.ID;

                foreach (TableRow tablita in (ObjetoGenerico as Table).Rows)
                {
                    foreach (TableCell tablitacell in tablita.Cells) 
                    { 
                        Object Objetoelemento = new Object();
                        Objetoelemento = tablitacell;
                        foreach (System.Web.UI.Control control in tablitacell.Controls)
                        {
                            if (control is TextBox)
                            {
                                 TextBox T = (control as TextBox);
                                 elemento = new ElementoControl();
                                 // seteamos los atributos de los elementos
                                 elemento.Nombre = T.ID.ToString();
                                 elemento.Tipo = "TextBox";
                                 elemento.Contenido = T.Text;
                                 elemento.Estado = "TRUE";
                                 seccion.ListaControl.Add(elemento);      
                            }

                             if (control is DropDownList)
                             {
                                 DropDownList D = (control as DropDownList);
                                 elemento = new ElementoControl();
                                 // seteamos los atributos de los elementos
                                 elemento.Nombre = D.ID.ToString();
                                 elemento.Tipo = "DropDownList";
                                 elemento.Contenido = D.SelectedValue.ToString();
                                 elemento.Estado = "TRUE";
                                 seccion.ListaControl.Add(elemento);
                             }
                        }
                    }
                }
                // guardamos el objeto "seccion" junto con su lista de Elementos
                (_requerimiento as Requerimiento).ListaSeccion.Add(seccion);
            }
            EnviarRequerimiento((_requerimiento as Requerimiento));
        }

        #endregion Extraer Valores del Acordeon

        #region Enviar Requerimiento
        /// <summary>
        /// Metodo para enviar El objeto completo de requerimiento 
        /// al comandoRequerimiento para escribir el XML.
        /// </summary>
        /// <param name="requerimiento"></param>
        public void EnviarRequerimiento(Requerimiento requerimiento)
        {
            try 
            {
                // llamamos a la variable session que contiene el id del proyecto actual
                Proyecto _miProyecto = (Proyecto)_vista.Sesion["proyecto"];
                // instanciamos un objeto del comandoAgregarRequerimiento
                _comandoRequerimiento = FabricaComando.CrearComandoAgregarRequerimiento(requerimiento, _miProyecto.IdProyecto);
                // ejecutamos al comando
                if (_comandoRequerimiento.Ejecutar())
                {
                    _vista.MensajeError.Text = "Se agrego el requerimiento con exito";
                    _vista.MensajeError.Visible = true;
                    _vista.botonContinuar.Visible = true;
                    _vista.botonGuardar.Visible = false;
                }
            }
            catch (Exception error)
            {
                _vista.MensajeError.Text = error.Message;
                _vista.MensajeError.Visible = true;
            }
            
            
        }
        #endregion Enviar Requerimiento

        #endregion Metodos
    }
}